#!/usr/bin/env python
# encoding: utf-8

import random

class Habilidad(object):

    nombre = ""
    descripcion = ""
    autor = ""

    def __init__(self):
        pass

    def obtener_costos(self):
        """ Devuelve un diccionario con los valores mínimos de 
            características y/o indicadores que debe tener la 
            criatura para poder aplicar la habilidad. """
        pass

    def obtener_consecuencias(self, origen, destino):
        """ Devuelve un diccionario con las alteraciones a realizar 
            sobre los atributos de la criatura origen y la criatura 
            destino.  Las alteraciones son positivas cuando se incrementa
            el valor del atributo y negativas cuando se lo decrementa. """
        pass

    def __str__(self):
        return "%s, por %s" % (self.nombre, self.autor)

    def __repr__(self):
        return str(self)

class Golpe(Habilidad):

    nombre = "golpe"
    descripcion = "Ataque sin costo que quita 3 HP al contrario."
    autor = "Marga"

    def obtener_costos(self):
        """ Devuelve un diccionario con los valores mínimos de 
            características y/o indicadores que debe tener la 
            criatura para poder aplicar la habilidad. """
        # Este ataque no tiene costo
        return { }

    def obtener_consecuencias(self, origen, destino):
        """ Devuelve un diccionario con las alteraciones a realizar 
            sobre los atributos de la criatura origen y la criatura 
            destino.  Las alteraciones son positivas cuando se incrementa
            el valor del atributo y negativas cuando se lo decrementa. """
        return {},{'hp': -3}

    def __str__(self):
        return "%s, por %s" % (self.nombre, self.autor)

    def __repr__(self):
        return str(self)

class BolaDeFuego(Habilidad):

    nombre = "bola de fuego"
    descripcion = "Ataque mágico que quita 5 HP al contrario, y cuesta 2 MP."
    autor = "Marga"

    def obtener_costos(self):
        return { 'mp': 2, 'inteligencia': 5}

    def obtener_consecuencias(self, origen, destino):
        return { 'mp': -2},{'hp': -3}

class Curar(Habilidad):

    nombre = "curar"
    descripcion = "Devuelve 10 HP a la criatura destino, cuesta 3 MP"
    autor = "Marga"

    def obtener_costos(self):
        return { 'mp': 3, 'inteligencia': 8 }

    def obtener_consecuencias(self, origen, destino):
        return { 'mp': -3},{'hp': 10}


class Trompada(Habilidad):

    nombre = "trompada"
    descripcion = "Hace un golpe proporcional a la fuerza de la criatura"
    autor = "Marga"

    def obtener_costos(self):
        return { }

    def obtener_consecuencias(self, origen, destino):
        fuerza = origen.obtener_estado()['fuerza']
        return { },{'hp': -1*fuerza}

class Espada(Habilidad):
    nombre = "espada"
    descripcion = "Hace daño proporcional a la destreza de la criatura origen y la de destino"
    autor = "Marga"

    def obtener_costos(self):
        return { }

    def obtener_consecuencias(self, origen, destino):
        destreza_origen = origen.obtener_estado()['destreza']
        destreza_destino = destino.obtener_estado()['destreza']
        if destreza_origen > destreza_destino:
            return { },{'hp': -2*(destreza_origen-destreza_destino)}
        else:
            return {'hp': (destreza_origen-destreza_destino) },{ }

class Arena(Habilidad):
    nombre = "arena"
    descripcion = "Lanza arena a los ojos del contrincante, este pierde la mitad de su destreza por el resto del combate"
    autor = "Maxy"

    def obtener_costos(self):
        return {}

    def obtener_consecuencias(self, origen, destino):
        return {}, { 'destreza': -1 * (destino.obtener_estado()['destreza'] / 2) }

class Martillo(Habilidad):
    nombre = "martillo"
    descripcion = "Golpe con martillo"
    autor = "Maxy"

    def obtener_costos(self):
        return { 'contextura': 10 }

    def obtener_consecuencias(self, origen, destino):
        f = origen.obtener_estado()['fuerza']
        c = origen.obtener_estado()['contextura']
        d = destino.obtener_estado()['contextura']
        golpe = max( f + c - d , 0 )

        return {}, { 'hp': -1*golpe }

class Examen(Habilidad):
    nombre = "examen dificil"
    descripcion = "Golpe psiquico, examen de Análisis III, baja inteligencia y sabiduria"
    autor = "Maxy"

    def obtener_costos(self):
        return { 'inteligencia': 10, 'sabiduria': 10 }

    def obtener_consecuencias(self, origen, destino):
        oi = origen.obtener_estado()['inteligencia']
        os = origen.obtener_estado()['sabiduria']
        di = destino.obtener_estado()['inteligencia']
        ds = destino.obtener_estado()['sabiduria']
        nota = ( (oi + os) - (di + ds) ) # maximo es 36 - 6 -> 30
        golpe = (-1) * max(nota, 0)

        return {}, { 'hp': golpe, 'inteligencia': golpe/10, 'sabiduria': golpe/10 }

# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4
